package dao

import (
	"context"
	"gorm.io/gorm/clause"
	"pay/api/pay"
	"pay/internal/model"
)

func (d *Dao) FindWechatValidConfigsByPage(ctx context.Context, sgId, pStoreId, pageNo, pageSize uint32) (
	configs []*model.WechatConfig, total int64, err error) {
	db := d.TransContext(ctx).Model(&model.WechatConfig{}).Where(
		"sg_id = ? AND p_store_id = ? AND status = ? AND account_status = ?",
		sgId, pStoreId, true, uint8(pay.WechatAccountStatus_FINISH))
	if err = db.Count(&total).Error; err != nil {
		err = d.processSqlError(err)
		return
	}
	if err = db.Limit(int(pageSize)).Offset(int((pageNo - 1) * pageSize)).Scan(&configs).Error; err != nil {
		err = d.processSqlError(err)
		return
	}
	return
}

func (d *Dao) FindWechatAllConfigsByPage(ctx context.Context, sgId, pStoreId, pageNo, pageSize uint32) (
	configs []*model.WechatConfig, total int64, err error) {
	db := d.TransContext(ctx).Model(&model.WechatConfig{}).Where(
		"sg_id = ? AND p_store_id = ? AND status = ?", sgId, pStoreId, true)
	if err = db.Count(&total).Error; err != nil {
		err = d.processSqlError(err)
		return
	}
	if err = db.Limit(int(pageSize)).Offset(int((pageNo - 1) * pageSize)).Scan(&configs).Error; err != nil {
		err = d.processSqlError(err)
		return
	}
	return
}

func (d *Dao) FindPreActivatedWechatConfigs(ctx context.Context) (
	configs []*model.WechatConfig, err error) {
	if err = d.TransContext(ctx).Model(&model.WechatConfig{}).Where(
		"account_status = ? AND status = ?",
		uint8(pay.WechatAccountStatus_PRE_ACTIVATED), true).Scan(&configs).Error; err != nil {
		err = d.processSqlError(err)
		return
	}
	return
}

func (d *Dao) FindWechatConfigsByIds(ctx context.Context, ids []uint32, sgId uint32) (
	configs []*model.WechatConfig, err error) {
	if err = d.TransContext(ctx).Model(&model.WechatConfig{}).Where(
		"id in ? AND sg_id = ? AND status = ?",
		ids, sgId, true).Scan(&configs).Error; err != nil {
		err = d.processSqlError(err)
		return
	}
	return
}

func (d *Dao) GetWechatConfig(ctx context.Context, configId, sgId, pStoreId uint32) (
	config *model.WechatConfig, err error) {
	config = &model.WechatConfig{}
	if err = d.TransContext(ctx).Model(&model.WechatConfig{}).Where(
		"id = ? AND sg_id = ? AND p_store_id = ? AND status = ?",
		configId, sgId, pStoreId, true).Take(config).Error; err != nil {
		err = d.processSqlError(err)
		return
	}
	return
}

func (d *Dao) GetWechatConfigById(ctx context.Context, configId, sgId uint32) (
	config *model.WechatConfig, err error) {
	config = &model.WechatConfig{}
	if err = d.TransContext(ctx).Model(&model.WechatConfig{}).Where(
		"id = ? AND sg_id = ? AND status = ?",
		configId, sgId, true).Take(config).Error; err != nil {
		err = d.processSqlError(err)
		return
	}
	return
}

// Lock 锁定单条记录
func (d *Dao) LockWechatConfigByID(ctx context.Context, rcv interface{}, id interface{}) error {
	return d.processSqlError(d.TransContext(ctx).Clauses(
		clause.Locking{Strength: "UPDATE"}).Where(
		"id = ? AND status = ?",
		id, true).Take(rcv).Error)
}
